/**
 * 组合继承 => 1-3-3.
 *      缺点：子类不是父亲的实例，而子类的原型是父亲的实例
 * 
 * 寄生组合式继承
 *      1、是寄生式继承和构造函数继承的组合
 *      2、子类再想添加原型方法就会覆盖掉从父类原型继承的对象
 */
function inheritObject(o) {
    // 声明一个过渡函数代码
    function F() {}
    // 过渡对象的原型继承父对象
    F.prototype = o;
    // 返回过渡对象的一个实例，该实例的原型继承了父对象
    return new F();
}

/**
 * 寄生式继承 继承原型
 * 只探究只继承父亲的原型，不再需要调用父类的构造函数
 * @param {*} subClass 子类
 * @param {*} superClass 父类
 */
function inheritPrototype(subClass, superClass) {
    // 复制一份父亲的原型副本保存在变量中
    var p = inheritObject(superClass.prototype);
    // 修正因为重写子类导致子类的constructor属性被修改
    p.constructor = subClass;
    // 设置子类的原型
    subClass.prototype = p;
}

// 测试代码
// 定义父类
function SuperClass(name) {
    this.name = name;
    this.colors = ['red', 'blue', 'green'];
}

SuperClass.prototype.getName = function() {
    console.log(this.name);
};

function SubClass(name, time) {
    SuperClass.call(this, name);
    this.time = time;
}

inheritPrototype(SubClass, SuperClass);
SubClass.prototype.getTime = function() {
    console.log(this.time);
};

var instance1 = new SubClass('js book', 2014);
var instance2 = new SubClass('css book', 2013);

instance1.colors.push('black');
console.log(instance1.colors);//["red", "blue", "green", "black"]
console.log(instance2.colors);//["red", "blue", "green"]
instance1.getName();//js book
instance1.getTime();//2014
